package com.example.yaohao.test_lhj;

import org.springframework.util.StringUtils;

import java.util.*;

/**
 * @Description 摇号算法实现
 * @Author 奶茶
 * Created by on 2018/8/22 9:00.
 */
public class Test {

    public static void main(String[] args) {
        long beginTime = System.currentTimeMillis();
        System.out.println("开始时间-：" + beginTime);
        getUserIds(initialUserList(),10000);
        long endTime = System.currentTimeMillis();
        System.out.println("结束时间-：" + endTime);
        System.out.println("所用时间-：" + (endTime-beginTime)/1000);
    }

    /**
     * 摇号逻辑实现
     * @param userList 摇号用户集合
     * @param number 摇中的人数
     * @return 摇中用户ID的集合
     */
    private static List<Integer> getUserIds(List<User> userList,Integer number){
        Integer num = 0;
        List<Integer> userIDList = new ArrayList<>();
        Map<Object,Integer> map = new HashMap<>(1);

        //初始化数组
        int factorSum = userList.stream().mapToInt(User::getFactor).sum();
        //将数组转换成集合 方便操作
        List<Integer> list = Arrays.asList(new Integer[factorSum + 1]);
        int index = 0;
        Boolean flag = true;

        //将倍率作为下标  userID 为值
        for (int i=0;i<userList.size();i++) {
            Integer userID = userList.get(i).getUserID();
            index = userList.get(i).getFactor();
            if(i == 0){
                list.set(index,userID);
            }else{
                if(flag){
                    flag = false;
                    index += userList.stream().limit(i).mapToInt(User::getFactor).sum();
                }else{
                    index += map.get("index_pre");
                }
                map.put("index_pre",index);
                list.set(index,userID);
            }
        }

        while (true){
            //生成一个随机下标
            int factorRange = getRandomNum(factorSum);

            //如果有值 直接取出
            Integer value = list.get(factorRange);
            if(!StringUtils.isEmpty(value)){
                userIDList.add(value);
                System.out.println(value);
                ++num;
            }else{
                //如果没值 截取当前下标之后的集合找第一个有值的点  取出值 存入
                Integer id = list.subList(factorRange, list.size()).stream()
                        .filter(str -> !StringUtils.isEmpty(str))
                        .findFirst()
                        .orElse(null);
                if(!StringUtils.isEmpty(id)){
                    userIDList.add(id);
                    System.out.println(id);
                    ++num;
                }
            }
            if(num.equals(number)){
                break;
            }
        }
        return userIDList;
    }


    /**
     * 初始化用户数据
     * @return
     */
    private static List<User> initialUserList(){
        List<User> userList = new ArrayList<>();
        for (int i=1;i<10000000;i++){
            User user = new User(i,getRandomNum(10));
            userList.add(user);
        }
        return userList;
    }

    /**
     * 获取随机数 闭区间
     * @param range
     * @return
     */
    private static Integer getRandomNum(Integer range){
        return new Random().nextInt(range + 1);
    }

}
